package cn.edu.pzhu.javaweb.util;

import javax.sql.DataSource;

import org.junit.Test;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * Druid数据库连接池工具类
 * 加载根目录下的druid.properties配置文件，提供数据源和连接获取方法
 */
public class DruidUtils {

    // 使用Java标准DataSource接口，底层实现为Druid连接池
    private static DataSource dataSource;

    // 静态代码块初始化连接池
    static {
        try {
            // 加载根目录下的druid.properties配置文件
            Properties prop = new Properties();
            // 通过类加载器获取配置文件输入流（根目录即类路径根目录）
            InputStream is = DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties");
            
            if (is == null) {
                throw new RuntimeException("未找到druid.properties配置文件，请检查是否放在类路径根目录下");
            }
            
            prop.load(is);
            // 通过Druid工厂类创建数据源
            dataSource = DruidDataSourceFactory.createDataSource(prop);
            System.out.println("Druid连接池初始化成功");
        } catch (Exception e) {
            // 初始化失败时抛出异常，终止工具类加载
            throw new ExceptionInInitializerError("Druid连接池初始化失败：" + e.getMessage());
        }
    }

    /**
     * 获取数据源（连接池）对象，返回Java标准DataSource接口
     * @return DataSource实例
     */
    public static DataSource getDataSource() {
        return dataSource;
    }

    /**
     * 从连接池获取数据库连接
     * 内部处理异常，发生异常时返回null并打印栈信息
     * @return 数据库连接对象，异常时返回null
     */
    public static Connection getConnection() {
        try {
            // 从连接池获取连接
            return dataSource.getConnection();
        } catch (SQLException e) {
            // 处理异常：打印栈信息并返回null
            System.err.println("从Druid连接池获取连接失败");
            e.printStackTrace();
            return null;
        }
    }
    @Test
    public void test() throws SQLException {
        for (int i = 1; i <= 11; i++) {
           Connection con = getConnection();
           System.out.println("druid:"+con);
           if(i==5) {
        	   con.close();
           }
        }
    }
}